147. Insertion Sort List
insert sort 的list实现
public class Solution {
public ListNode insertionSortList(ListNode head) {ListNode preNode = new ListNode(0);
preNode.next = head;
if (head == null) {
return null;
}
ListNode curr = head.next;
ListNode pre = head;
while (curr != null) {
if(curr.val < pre.val)
{
ListNode nextNode=curr.next;//保存下一个需要遍历的节点
//寻找插入的合适位置
ListNode curr2=preNode.next;
ListNode temp=preNode;//记录cur2前面一个节点
while(curr.val > curr2.val && curr2 != pre)
{
temp=curr2;
curr2=curr2.next;
}
//进行插入
temp.next=curr;
curr.next=curr2;
pre.next=nextNode;
//继续遍历下一个节点
curr = nextNode;
}
else {
pre=curr;
curr = curr .next;
}
}
return preNode.next;
}
}
143. Reorder List
先用快慢指针将list分成两段,将后一段反转,在加到前一段中
public class Solution {
public void reorderList(ListNode head) {
if (head != null && head.next != null && head.next.next != null) {
// use fast referance and slow referance to get the middle node of list
ListNode currF = head;
ListNode currS = head;
while (currF.next != null && currF.next.next != null) {
currF = currF.next.next;
currS = currS.next;
}
ListNode lastNode = currS.next;
// break the chain
currS.next = null;
// reverse
lastNode = reverse(lastNode);
// combine two list
ListNode curr = head;
ListNode currL = lastNode;
while (currL != null) {
ListNode temp = curr.next;
ListNode tempL = currL.next;
curr.next = currL;
currL.next = temp;
curr = temp;
currL = tempL;
}
}
}
private ListNode reverse(ListNode head) {
ListNode prev = null;
while (head != null) {
ListNode temp = head.next;
head.next = prev;
prev = head;
head = temp;
}
return prev;
}
}
141. Linked List Cycle
如果要做到不同额外空间,就要用两个指针,一个快一个慢,如果成环,快指针会等于慢指针。
public class Solution {
public boolean hasCycle(ListNode head) {
if (head == null || head.next == null) {
return false;
}
ListNode currF = head;
ListNode currS = head;
boolean output = false;
while (currF.next != null && currF.next.next != null) {
currF = currF.next.next;
currS= currS.next;
if (currF == currS) {
output = true;
break;
}
}
return output;
}
}
142. Linked List Cycle II
这道题看了http://www.jianshu.com/p/ce7f035daf74的思路。。。。
public class Solution {
public ListNode detectCycle(ListNode head) {
if (head == null || head.next == null) {
return null;
}
ListNode currF = head;
ListNode currS = head;
boolean output = false;
while (currF.next != null && currF.next.next != null) {
currF = currF.next.next;
currS= currS.next;
if (currF == currS) {
output = true;
break;
}
}
if (output == false ) {
return null;
}
else {
ListNode curr1 = head;
ListNode curr2 = currF;
while (curr1 != curr2) {
curr1 = curr1.next;
curr2 = curr2.next;
}
return curr1;
}
}
}