leetcode.02.07链表相交
一、题目
这个题目目标太冗余了,其实我们要做就是返回相交的节点指针
二、分析
参考的方法,主要是确定两个链表对齐位置,逐个向后面比较,返回相等的指针即可
三、参考代码
一种比较简洁的解法:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { //这道题就是求解相交位置,即两个链表本身是存在相交节点 //首先求解长度 ListNode* pre_1 = headA; ListNode* pre_2 = headB; while(pre_1!=pre_2){ pre_1 = (pre_1 == NULL? headB : pre_1->next); pre_2 = pre_2 == NULL? headA : pre_2->next; } return pre_1; } };
一种符合思维的代码(代码随想录)
class Solution { public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { ListNode* curA = headA; ListNode* curB = headB; int lenA = 0, lenB = 0; while (curA != NULL) { // 求链表A的长度 lenA++; curA = curA->next; } while (curB != NULL) { // 求链表B的长度 lenB++; curB = curB->next; } curA = headA; curB = headB; // 让curA为最长链表的头,lenA为其长度 if (lenB > lenA) { swap (lenA, lenB); swap (curA, curB); } // 求长度差 int gap = lenA - lenB; // 让curA和curB在同一起点上(末尾位置对齐) while (gap--) { curA = curA->next; } // 遍历curA 和 curB,遇到相同则直接返回 while (curA != NULL) { if (curA == curB) { return curA; } curA = curA->next; curB = curB->next; } return NULL; } };
纵一苇之所如,临万顷之茫然。