[LeetCode系列] 双单链表共同节点搜索问题
2015-03-29 16:22
351 查看
找到两个单链表的共同节点.
举例来说, 下面两个链表A和B:
共同节点为c1.
分析:
共同节点距离A,B的起点headA, headB的距离差为定值, 等于它们的各自总长的差值, 我们只需要求出这个差值, 把两个链表的头移动到距离c1相等距离的起点处即可.
代码:
举例来说, 下面两个链表A和B:
A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3
共同节点为c1.
分析:
共同节点距离A,B的起点headA, headB的距离差为定值, 等于它们的各自总长的差值, 我们只需要求出这个差值, 把两个链表的头移动到距离c1相等距离的起点处即可.
代码:
/** * 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) { int deltaLength = getLengthOfList(headA) - getLengthOfList(headB); // A > B if (deltaLength > 0) { while (deltaLength-- > 0) headA = headA->next; } // A < B else if (deltaLength < 0) { while (deltaLength++ < 0) headB = headB->next; } // now A and B has the same distance to intersection node while (NULL != headA && NULL != headB) { if (headA == headB) return headA; headA = headA->next; headB = headB->next; } return NULL; } int getLengthOfList(ListNode *head) { int res = 0; while (NULL != head) { res++; head = head->next; } return res; } };
相关文章推荐
- [LeetCode系列] K节点倒序问题迭代解法
- (转)问题:假设一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(既不是第一个,也不是最后一个节点),请将该节点从单链表中删除。
- leetcode: 2Sum/3Sum/3SumClosest/4Sum系列问题
- [LeetCode系列]括号生成问题
- [LeetCode系列]子集枚举问题[有重复元素]
- [LeetCode系列]子集枚举问题[无重复元素]
- 小算法系列-判断单链表是否存在环,判断两个链表是否相交问题详解(转)
- 有关单链表的两个问题【遍历一次求中间节点,倒数第K个结点】
- [LeetCode系列]爬梯问题的递归解法转换为迭代解法
- [LeetCode系列] 二叉树最大深度求解问题(C++递归解法)
- [LeetCode系列]翻转链表问题II
- 搜索系列——1321 棋盘问题
- LeetCode 笔记系列 14 N-Queen II [思考的深度问题]
- LeetCode 笔记系列六 Reverse Nodes in k-Group [学习如何逆转一个单链表]
- [LeetCode系列]N皇后问题递归解法 -- 位操作方式
- 【问题描述】1.创建单链表;2.然后删除重复的节点 ?
- 【经典问题】快速找到未知长度单链表的中间节点
- 二叉搜索树中任意两个节点的最近共同父父节点2(LCA问题)
- [LeetCode系列]链表环探测问题II
- [LeetCode系列]BST有效性确定问题[前序遍历]