讨论/算法和数据结构/你是如何想到巧妙的解法的?/
你是如何想到巧妙的解法的?

我经常有这样的经历,自己写完代码提交通过,然后看排名第一的解法,经常发现更加巧妙的解法。于是我在想这里面是否有一些方法论可以聊聊。
比如 “奇偶链表” 这题,我的解法思路是:先遍历一遍链表,找到最后一个指针 last,再使用两个指针分别为 a,b 并指向头,然后 b 指针往下走一步,因为这是偶数指针,所以把这个节点挪到最后,接着 a 指针往下走一步,如此循环,直到 b 碰到 last 为止。
而我看到一个更加巧妙的解法,就感觉大家的脑回路差别好大,上代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
//更聪明的思路
class Solution {
    public ListNode oddEvenList(ListNode head) {
        if(head == null) {
            return null;
        }
        
        ListNode odd = head;
        ListNode even = head.next;
        ListNode evenHead = even;
        while(even != null && even.next != null) {
            odd.next = even.next;
            odd = odd.next;
            even.next = odd.next;
            even = even.next; 
        }
        odd.next = evenHead;
        return head;
    }
}
//这是我的代码
//class Solution {
//    public ListNode oddEvenList(ListNode head) {
//        if(head == null || head.next == null || head.next.next == null) {
//            return head;
//        }
//       
//        ListNode lastp = head;
//        int length = 1;
//        while(lastp.next != null) {
//            length ++;
//            lastp = lastp.next;
//        }
//        int count = length / 2;
//        
//        ListNode scanp = head;
//        ListNode lastTmpp = lastp; 
//        while(count != 0) {
//            ListNode evenp = scanp.next; 
//            ListNode nextOddp = scanp.next.next;
//            lastTmpp.next = evenp;
//            evenp.next = null;
//            lastTmpp = evenp;
//            scanp.next = nextOddp;                     
//            scanp = nextOddp;
//            count --;
//        }
//        
//        return head;
//    }
//}
展开讨论

想不到。。。。

展开全部 2 讨论