剑指 Offer 25. 合并两个排序的链表
定义两个头,判断两者的数值大小,分别添加后移即可
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(!l1) return l2;
if(!l2) return l1;
ListNode* p;
ListNode* ans=new ListNode();
p=ans;
while(l1!=NULL||l2!=NULL){
if(l1==NULL){
ans->next=l2;
ans=ans->next;
l2=l2->next;
}
else if(l2==NULL){
ans->next=l1;
l1=l1->next;
ans=ans->next;
}
else{
if(l1->val<l2->val){
ans->next=l1;
l1=l1->next;
ans=ans->next;
}
else{
ans->next=l2;
ans=ans->next;
l2=l2->next;
}
}
}
return p->next;
}
};
剑指 Offer 52. 两个链表的第一个公共节点
这题两个指针遍历链表,当链表遍历完之后就从另一个链表的头开始,如果存在公共节点,那么两个指针一定会在公共结点相遇
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(headA==NULL||headB==NULL) return NULL;
ListNode* p1=headA;
ListNode* p2=headB;
while(p1&&p2){
if(p1==p2) return p1;
p1=p1->next;
p2=p2->next;
}
if(p1==p2&&p1==NULL) return NULL;
while(p1||p2){
if(p1==p2) return p1;
if(p1==NULL) p1=headB;
else p1=p1->next;
if(p2==NULL) p2=headA;
else p2=p2->next;
}
return NULL;
}
};