3、合并两个排序链表
描述:输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
思路:创建一个新的链表,并按大小将两个链表中的数据插入进去。
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
if(pHead1 == NULL && pHead2 == NULL)return NULL;
//创建一个新的链表
ListNode *head = new ListNode(0);
ListNode *tem = head;
//将两个链表中较小的值插入到新链表中
while(pHead1 != NULL && pHead2 != NULL)
{
if(pHead1->val > pHead2->val)
{
tem->next = pHead2;
pHead2 = pHead2->next;
}
else{
tem->next = pHead1;
pHead1 = pHead1->next;
}
tem = tem->next;
}
//跳出循环代表有一个链表必为空,此时若是2链表为空,则让新链表的最后一个节点指向1链表的剩余部分
if(pHead1 != NULL)
{
tem->next = pHead1;
}
//与上同理
if(pHead2 != NULL)
{
tem->next = pHead2;
}
//创建的链表的下一个节点即为要得到的链表
return head->next;
}
};
思路清晰了你也赶快练一练吧~
合并两个有序链表
4、两个链表的第一个公共节点
描述:输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
思路:创建两个指针分别从两个链表的头开始遍历,如果第一个链表遍历完了而第二个链表没有遍历完,则将第一个链表遍历的指针放到第二个链表头部继续遍历,第二个则放到第一个进行遍历,反之亦然,类似于圆圈追赶,两个人虽然速度不一样但总会相遇,如果没有公共节点,则最后都会走到空也算是相等。
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
ListNode* tem1 = pHead1;
ListNode* tem2 = pHead2;
while(tem1 != tem2)
{
tem1 = (tem1 != NULL)?tem1->next:pHead2;
tem2 = (tem2 != NULL)?tem2->next:pHead1;
}
return tem1;
}
};
思路清晰了你也赶快练一练吧~
两个链表的第一个公共节点