剑指offer:合并两个有序链表

题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

解题思路

一、非递归

①利用两个node(head、cur),head指向头节点,cur指向当前处理的节点。

②遍历比较list1和list2的元素,将小的元素添加入链表,如果一条链表遍历结束,将另一条剩余元素合并到新链表。

③最后返回头节点。

    public ListNode Merge(ListNode list1,ListNode list2) {
            if(list1 == null){ //list1为空
                return list2;
            }
            if(list2 == null){ //list2为空
                return list1;
            }
            ListNode head = null;
            ListNode cur = null;
            while(list1 != null && list2 != null){ //当list1 与 list2 都不为空
                  if(list1.val < list2.val){  //list1的元素 小于 list2的元素  
                      if(head == null){ 	 //当添加第一个元素
                          cur = head = list1; //头节点指向第一个元素
                      }else{		
                          cur.next = list1;  //将元素添加入链表 
                          cur = cur.next;	//移动cur指针
                      }
                      list1 = list1.next;  //移动list1指针
                  }else{
                      if(head == null){
                          cur = head = list2;
                      }else{
                          cur.next = list2;
                          cur = cur.next;
                      }
                      list2 = list2.next;
                  }
            }
            if(list1 == null){	//list1遍历结束
                cur.next = list2; //将list2剩余元素添加入新链表
            }
            if(list2 == null){	//list2遍历结束
                cur.next = list1;//将list1剩余元素添加入新链表
            }
            return head;  //返回头节点
        }

二、递归

逐个比较list1的元素与list2的元素大小,将小的元素添加到另一条链表,最后两条链表都是有序链表,返回任意一条即可。

public ListNode Merge(ListNode list1,ListNode list2) {
        if(list1 == null){
            return list2;
        }
        if(list2 == null){
            return list1;
        }
        while(list1 != null && list2 != null){
            if(list1.val < list2.val){  //比较list1的val 与 list2的val
                //将list2的元素添加到list1中,直到list1.val 》 list2.val
                list1.next = Merge(list1.next,list2); 
                return list1;												
            }else{
                //将list1的元素添加到list2中,直到list1.val 《 list2.val
                list2.next = Merge(list1,list2.next);
                return list2;
            }
        }
        return list1; //list1 == list2
    }
posted @ 2020-03-04 19:06  灵图  阅读(169)  评论(0)    收藏  举报