链表的题

1、公共节点

题目描述:输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)

问题:什么是公共节点:图上的3就是

链表的题_第1张图片

思路:找两个链表的长度,从长度一致的位置开始遍历,第一个链表长度超出的部分就不用管了。

链表的题_第2张图片

剩下的判断就成了

具体实现:

import java.io.FileInputStream;

class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}

/**
 * 输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
 *
 * 可以看一下链表的公共节点的图,了解一下概念
 */
public class Solution3 {
    public static ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        int lenList1 = 0;
        int lenList2 = 0;
        ListNode p1 = pHead1;
        ListNode p2 = pHead2;
        while(p1!=null){
            lenList1++;
            p1 = p1.next;
        }
        while(p2!=null){
            lenList2++;
            p2 = p2.next;
        }
        p1 = pHead1;
        p2 = pHead2;
        int sublen = lenList1-lenList2;
        if(sublen>0){
            while((sublen--)>0){
                p1 = p1.next;
            }
        }
        else if(sublen<0){
            while((sublen++)<0){
                p2 = p2.next;
            }

        }
        while(p1!=p2){
            p1 = p1.next;
            p2 = p2.next;
        }
        return p1;
    }

    public static void main(String[] args) {
        ListNode n1 = new ListNode(1);
        ListNode n2 = new ListNode(2);
        ListNode n3 = new ListNode(3);
        ListNode n4 = new ListNode(4);
        n1.next = n2;
        n2.next = n3;
        n4.next = n3;
        System.out.println(FindFirstCommonNode(n4, n1).val);
    }
}

2、反转链表

题目描述:输入一个链表,反转链表后,输出新链表的表头。

思路,两个指针p,q,新链表定义了头结点,newHead定义头结点时候插入比较简单。

class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}

/**
 * 输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
 *
 * 可以看一下链表的公共节点的图,了解一下概念
 */
public class Solution3 {
    public static ListNode ReverseList(ListNode head) {
        //创建一个新的头节点,使用头插法
        ListNode newHead = new ListNode(-1);
        //指针一直指向新链表的头结点
        ListNode p = newHead;//新链表的头
        ListNode q = head;//指向原来链表的指针
        while(q!=null){
            head = head.next;
            q.next = newHead.next;
            newHead.next = q;
            q = head;

        }

        return newHead.next;
    }

    public static void main(String[] args) {
        ListNode n1 = new ListNode(1);
        ListNode n2 = new ListNode(2);
        ListNode n3 = new ListNode(3);
        n1.next = n2;
        n2.next = n3;

        ListNode head = ReverseList(n1);
        while(head!=null){
            System.out.println(head.val);
            head = head.next;
        }

    }
}

 

你可能感兴趣的:(笔试)