leetcode: Reorder List

来源:互联网 发布:linux操作系统源码 编辑:程序博客网 时间:2024/05/16 18:49
问题的难点在于链表是单向的...因而我们可以把后一半的链表倒序再插入前一半中...

利用快慢指针找到链表的中点并利用两个指针将后一半链表颠倒...

插入的时候按次将点到后的后一半节点插入到前一般中即可.....

需要注意的是在颠倒和插入节点的时候,最好使用新的对象来避免之后变量改变导致之前也受影响....还是需要细心,多考虑可能出现的边界情况

/** * Definition for singly-linked list. * class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { *         val = x; *         next = null; *     } * } */public class Solution {    public void reorderList(ListNode head) {        if(head == null)        {            return ;        }        ListNode slow = head;        ListNode fast = head;        int len=1;        while(fast.next!=null&&fast.next.next!=null)        {            slow = slow.next;            fast = fast.next.next;            len++;        }        if(len==1)        {            return ;        }        ListNode half_start = slow.next;        ListNode bef = null;        while(half_start!=null)        {            ListNode now = new ListNode(half_start.val);            half_start = half_start.next;            now.next = bef;            bef = now;        }        ListNode res = head;        while(len>0)        {            len = len-1;            ListNode tmp = res.next;            if(bef==null)            {                res.next = null;                break;            }            else            {                res.next = new ListNode(bef.val);                res = res.next;                bef = bef.next;            }            if(len!=0)            {                res.next = tmp;                res = res.next;            }        }        return ;    }}


0 0