leecode twopointers 合并两个排序的链表

O

问题

在这里插入图片描述

在这里插入图片描述

解决方案

代码


/*
struct ListNode {
   int val;
   struct ListNode *next;
   ListNode(int x) :
   		val(x), next(NULL) {
   }
   
   
思路: 合并问题采用双指针的基础操作,没有快慢, 只有对比。 从左边遍历到右边, 哪一边能走就走哪一边。 

-  define left right =head, current.
- while(left &&right)
- -  if left val < right val   current = left; current = current->next; left = left->next  ,  
- - else   current = right current = current ->next 
- 
};*/
class Solution {
    
    
public:
   ListNode* Merge(ListNode* pHead1, ListNode* pHead2){
    
    
       ListNode* left = pHead1;
       ListNode* right = pHead2;
       
       if(left==NULL){
    
    
           return right;
       }
       if(right==NULL){
    
    
           return left; 
       }        
       
       ListNode *current  = new ListNode(0);
       ListNode* h = current;
       
       
       while(left!=nullptr&&right!=nullptr){
    
    
           if(left->val<=right->val){
    
      // if we get same val , firt we make one into list , next step is another.
               current->next = left;
               current = current->next;
               left = left->next;
           }
     
           else if (left->val>right->val){
    
    
               current->next = right;
               current = current->next;
               right = right->next;           
           }
       }
       if(left)current->next = left;
       if(right)current->next = right;
       return h->next;
       
   }
};

总结与反思

  1. 注意== 情况下是怎么走的,一个走过去之后下一次判断也会把等于的另外一个带上。 如果一起走也是可以的。两边同时加1。
  2. 注意 ==单独判断的时候current指针很容易修改指向的其他地址内容,这里就不建议用next.next了。 要是数组的话单独判断没问题,但是链表乱等于容易把地址里面的内容弄没了。

猜你喜欢

转载自blog.csdn.net/liupeng19970119/article/details/114070095