相交链表

可紊 提交于 2020-02-08 18:25:48

题目

Alt

思路

自己的思路——暴力解法

  • 分别遍历两个链表,记录下他们的长度s1,s2
  • 长链表先走|s1-s2|,然后短链表再以相同的速度出发
  • 当两个链表相等时,便是相交节点
    相关代码如下:
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if (!headA || !headB)
			return NULL;
		ListNode* A = headA;
		ListNode* B = headB;
		int ch1=0, ch2=0;
		while (A->next) {
			A = A->next;
			ch1++;
		}
		while (B->next) {
			B = B->next;
			ch2++;
		}
		if (B != A)
			return NULL;
		A = headA;
		B = headB;
		if (ch1 > ch2) {
			ch1 = ch1 - ch2;
			while (ch1) {
				A = A->next;
				ch1--;
			}
		}
		else {
			ch2 = ch2 - ch1;
			while (ch2) {
				B = B->next;
				ch2--;
			}
		}
		while (B != A) {
			A = A->next; 
			B = B->next;
		}
		return A;
    }
};

参考思路——巧妙解题

当某个链表到达NULL时,便将指针指向另外一个链表开始遍历,如果两个链表相交,那么他们相等的节点就等于初始的相交节点(相等的节点可能为NULL),代码如下:

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        /**
        定义两个指针, 第一轮让两个到达末尾的节点指向另一个链表的头部, 最后如果相遇则为交点(在第一轮移动中恰好抹除了长度差)
        两个指针等于移动了相同的距离, 有交点就返回, 无交点就是各走了两条指针的长度
        **/
        if(headA == null || headB == null) return null;
        ListNode pA = headA, pB = headB;
        // 在这里第一轮体现在pA和pB第一次到达尾部会移向另一链表的表头, 而第二轮体现在如果pA或pB相交就返回交点, 不相交最后就是null==null
        while(pA != pB) {
            pA = pA == null ? headB : pA.next;
            pB = pB == null ? headA : pB.next;
        }
        return pA;
    }
}

这里的实质就是利用了两个链表长度之和固定,即A+B=B+A,所以遍历A+B和遍历B+A一定是同时结束的,那么他们也一定会同时到达交点,如果A,B不相交的话就返回NULL

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!