1.剑指 Offer 25. 合并两个排序的链表【简单】
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例1:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
创建新表:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { //我的代码居然和孙笑川一模一样也是晦气了
ListNode *head=new ListNode; //别人管这个叫dummyHead
ListNode *l=head;
while(l1!=NULL && l2!=NULL){ //将两个表中较小的结点加入新的表中
if(l1->val<l2->val){
l->next=l1;
l1=l1->next;
}
else{
l->next=l2;
l2=l2->next;
}
l=l->next;
}
if(l1!=NULL) //将不是空的链表接上即可
l->next=l1;
else
l->next=l2;
return head->next;
}
递归:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(l1==NULL)
return l2;
if(l2==NULL)
return l1;
if(l1->val<=l2->val){
l1->next=mergeTwoLists(l1->next,l2);
return l1;
}
else{
l2->next=mergeTwoLists(l1,l2->next);
return l2;
}
}
\qquad
2.剑指 Offer 52. 两个链表的第一个公共节点【简单】
输入两个链表,找出它们的第一个公共节点。
hash集合:
先把A的结点全部加入unordered_set里面,然后逐一判断B的结点并加入即可…O(n)
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(headA==NULL || headB==NULL)
return NULL;
unordered_set<ListNode *> visited;
ListNode *temp=headA;
while(temp!=NULL){
visited.insert(temp); //插入集合中
temp=temp->next;
}
temp=headB;
while(temp!=NULL){
if(visited.count(temp)) //若有,count返回1
return temp;
temp=temp->next;
}
return NULL;
}
浪漫解法:
m,n分别做模m的减法和模n的减法,指定一个数(相遇位置),m和n每次减一,多次以后,m与n会均为这个数,即相遇了?
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(headA==NULL || headB==NULL)
return NULL;
ListNode *p=headA,*q=headB;
while(p!=q){
p= p==NULL?headA:p->next; //不断地遍历,多遍以后总会相遇
q= q==NULL?headB:q->next;
}
return q;
}